/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * AppFrame.java
 *
 * Created on 16-jun-2011, 4:34:21
 */
package pfc.gui;

import pfc.arbol.Monitor;
import pfc.arbol.ProjectsMonitor;
import java.awt.Dimension;
import java.io.File;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;
import org.apache.commons.configuration.CompositeConfiguration;
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.PropertiesConfiguration;
import pfc.arbol.ArbolFicheros;
import pfc.comun.Errores;
import pfc.comun.IDEpfc;
import pfc.comun.Proyecto;
import pfc.arbol.ArbolProyectos;
import pfc.arbol.CellRenderer;
import pfc.arbol.FileTreeNode;
import pfc.arbol.PFCTreeNode;

/**
 *
 * @author xandru
 */
public class AppFrame extends javax.swing.JFrame {

    CompositeConfiguration configuracion;
    IDEpfc ide;
    public OutputConsole consola;

    /** Creates new form AppFrame */
    public AppFrame() {

        try {
            //cargar la configuracion
            loadConfiguration();
        } catch (ConfigurationException ex) {
            Logger.getLogger(AppFrame.class.getName()).log(Level.SEVERE, null, ex);
            System.out.println(ex.getMessage());
            System.exit(0);
        }
        ide = new IDEpfc(this, configuracion);
        initComponents();
        jtArbolProyectos.setModel(ArbolProyectos.load(ide));
        jtArbolProyectos.setCellRenderer(new CellRenderer());
        jbGuardar.setEnabled(false);
        initArbolFicheros();
        initOutputConsole();
    }

    public IDEpfc getIDE() {
        return ide;
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        edicionProyecto = new javax.swing.JDialog();
        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        jLabel3 = new javax.swing.JLabel();
        tfNombreProyecto = new javax.swing.JTextField();
        tfDirectorioProyecto = new javax.swing.JTextField();
        tfUbicacionProyecto = new javax.swing.JTextField();
        jButton1 = new javax.swing.JButton();
        jbAceptarProyecto = new javax.swing.JButton();
        jButton3 = new javax.swing.JButton();
        propiedadesProyecto = new javax.swing.JPopupMenu();
        jMenuItem7 = new javax.swing.JMenuItem();
        jMenuItem8 = new javax.swing.JMenuItem();
        acercaDe = new javax.swing.JDialog();
        jLabel4 = new javax.swing.JLabel();
        jLabel5 = new javax.swing.JLabel();
        jSplitPane1 = new javax.swing.JSplitPane();
        jPanel1 = new javax.swing.JPanel();
        jTabbedPane1 = new javax.swing.JTabbedPane();
        jPanel4 = new javax.swing.JPanel();
        jScrollPane1 = new javax.swing.JScrollPane();
        jtArbolProyectos = new javax.swing.JTree();
        jPanel5 = new javax.swing.JPanel();
        jScrollPane2 = new javax.swing.JScrollPane();
        jtArbolFicheros = new javax.swing.JTree();
        jtPanelEdicion = new javax.swing.JTabbedPane();
        jPanel2 = new javax.swing.JPanel();
        jPanel6 = new javax.swing.JPanel();
        jToolBar1 = new javax.swing.JToolBar();
        jbGuardar = new javax.swing.JButton();
        jMenuBar1 = new javax.swing.JMenuBar();
        jMenu1 = new javax.swing.JMenu();
        jMenuItem2 = new javax.swing.JMenuItem();
        jSeparator3 = new javax.swing.JPopupMenu.Separator();
        jMenuItem5 = new javax.swing.JMenuItem();
        jMenu2 = new javax.swing.JMenu();
        jMenuItem6 = new javax.swing.JMenuItem();
        jMenu4 = new javax.swing.JMenu();
        Ant = new javax.swing.JMenuItem();
        Tomcat = new javax.swing.JMenuItem();
        jMenu3 = new javax.swing.JMenu();
        jMenuItem9 = new javax.swing.JMenuItem();
        jMenuItem1 = new javax.swing.JMenuItem();

        edicionProyecto.setTitle("Proyecto");
        edicionProyecto.setModalityType(java.awt.Dialog.ModalityType.APPLICATION_MODAL);

        jLabel1.setText("Nombre Proyecto:");

        jLabel2.setText("Directorio de proyectos:");

        jLabel3.setText("Ubicacion Proyecto:");

        tfNombreProyecto.setText("Proyecto1");
        tfNombreProyecto.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                tfNombreProyectoKeyPressed(evt);
            }
            public void keyReleased(java.awt.event.KeyEvent evt) {
                tfNombreProyectoKeyReleased(evt);
            }
            public void keyTyped(java.awt.event.KeyEvent evt) {
                tfNombreProyectoKeyTyped(evt);
            }
        });

        tfDirectorioProyecto.setText("jTextField2");
        tfDirectorioProyecto.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                tfDirectorioProyectoActionPerformed(evt);
            }
        });
        tfDirectorioProyecto.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                tfDirectorioProyectoKeyPressed(evt);
            }
            public void keyReleased(java.awt.event.KeyEvent evt) {
                tfDirectorioProyectoKeyReleased(evt);
            }
            public void keyTyped(java.awt.event.KeyEvent evt) {
                tfDirectorioProyectoKeyTyped(evt);
            }
        });

        tfUbicacionProyecto.setEditable(false);
        tfUbicacionProyecto.setText("jTextField1");

        jButton1.setText("Elegir");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        jbAceptarProyecto.setText("Aceptar");
        jbAceptarProyecto.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jbAceptarProyectoActionPerformed(evt);
            }
        });

        jButton3.setText("Cancelar");
        jButton3.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton3ActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout edicionProyectoLayout = new javax.swing.GroupLayout(edicionProyecto.getContentPane());
        edicionProyecto.getContentPane().setLayout(edicionProyectoLayout);
        edicionProyectoLayout.setHorizontalGroup(
            edicionProyectoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(edicionProyectoLayout.createSequentialGroup()
                .addGroup(edicionProyectoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(edicionProyectoLayout.createSequentialGroup()
                        .addContainerGap()
                        .addGroup(edicionProyectoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(edicionProyectoLayout.createSequentialGroup()
                                .addComponent(jLabel3)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                .addComponent(tfUbicacionProyecto, javax.swing.GroupLayout.PREFERRED_SIZE, 254, javax.swing.GroupLayout.PREFERRED_SIZE))
                            .addGroup(edicionProyectoLayout.createSequentialGroup()
                                .addGroup(edicionProyectoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                                    .addGroup(javax.swing.GroupLayout.Alignment.LEADING, edicionProyectoLayout.createSequentialGroup()
                                        .addComponent(jLabel1)
                                        .addGap(18, 18, 18)
                                        .addComponent(tfNombreProyecto))
                                    .addGroup(javax.swing.GroupLayout.Alignment.LEADING, edicionProyectoLayout.createSequentialGroup()
                                        .addComponent(jLabel2)
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                        .addComponent(tfDirectorioProyecto, javax.swing.GroupLayout.PREFERRED_SIZE, 169, javax.swing.GroupLayout.PREFERRED_SIZE)))
                                .addGap(18, 18, 18)
                                .addComponent(jButton1))))
                    .addGroup(edicionProyectoLayout.createSequentialGroup()
                        .addGap(105, 105, 105)
                        .addComponent(jbAceptarProyecto)
                        .addGap(41, 41, 41)
                        .addComponent(jButton3)))
                .addContainerGap(31, Short.MAX_VALUE))
        );
        edicionProyectoLayout.setVerticalGroup(
            edicionProyectoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(edicionProyectoLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(edicionProyectoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel1)
                    .addComponent(tfNombreProyecto, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(18, 18, 18)
                .addGroup(edicionProyectoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel2)
                    .addComponent(tfDirectorioProyecto, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jButton1))
                .addGap(18, 18, 18)
                .addGroup(edicionProyectoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel3)
                    .addComponent(tfUbicacionProyecto, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 39, Short.MAX_VALUE)
                .addGroup(edicionProyectoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jbAceptarProyecto)
                    .addComponent(jButton3))
                .addContainerGap())
        );

        jMenuItem7.setText("Propiedades");
        jMenuItem7.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem7ActionPerformed(evt);
            }
        });
        propiedadesProyecto.add(jMenuItem7);

        jMenuItem8.setText("jMenuItem8");
        propiedadesProyecto.add(jMenuItem8);

        acercaDe.setTitle("Proyecto Fin de Carrera. Alejandro Fernandez Prendes");
        acercaDe.setMinimumSize(new java.awt.Dimension(516, 139));
        acercaDe.setModal(true);

        jLabel4.setText("Autor: Alejandro Fernandez Prendes");

        jLabel5.setText("Titulo: Desarrollo de un IDE para desarrollo de aplicaciones J2EE basado en el modelo de datos");

        javax.swing.GroupLayout acercaDeLayout = new javax.swing.GroupLayout(acercaDe.getContentPane());
        acercaDe.getContentPane().setLayout(acercaDeLayout);
        acercaDeLayout.setHorizontalGroup(
            acercaDeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(acercaDeLayout.createSequentialGroup()
                .addGap(30, 30, 30)
                .addGroup(acercaDeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jLabel5)
                    .addComponent(jLabel4))
                .addContainerGap(33, Short.MAX_VALUE))
        );
        acercaDeLayout.setVerticalGroup(
            acercaDeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(acercaDeLayout.createSequentialGroup()
                .addGap(47, 47, 47)
                .addComponent(jLabel5)
                .addGap(28, 28, 28)
                .addComponent(jLabel4)
                .addContainerGap(36, Short.MAX_VALUE))
        );

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("PFC. Alejandro Fernandez Prendes.");
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosed(java.awt.event.WindowEvent evt) {
                formWindowClosed(evt);
            }
            public void windowClosing(java.awt.event.WindowEvent evt) {
                formWindowClosing(evt);
            }
        });

        jSplitPane1.setBorder(null);

        jtArbolProyectos.setModel(new ArbolProyectos(new DefaultMutableTreeNode("Proyectos"),ide));
        jtArbolProyectos.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                jtArbolProyectosMouseClicked(evt);
            }
            public void mousePressed(java.awt.event.MouseEvent evt) {
                jtArbolProyectosMousePressed(evt);
            }
        });
        jScrollPane1.setViewportView(jtArbolProyectos);

        javax.swing.GroupLayout jPanel4Layout = new javax.swing.GroupLayout(jPanel4);
        jPanel4.setLayout(jPanel4Layout);
        jPanel4Layout.setHorizontalGroup(
            jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 158, Short.MAX_VALUE)
        );
        jPanel4Layout.setVerticalGroup(
            jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 520, Short.MAX_VALUE)
        );

        jTabbedPane1.addTab("Projectos", jPanel4);

        jtArbolFicheros.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                jtArbolFicherosMousePressed(evt);
            }
        });
        jScrollPane2.setViewportView(jtArbolFicheros);

        javax.swing.GroupLayout jPanel5Layout = new javax.swing.GroupLayout(jPanel5);
        jPanel5.setLayout(jPanel5Layout);
        jPanel5Layout.setHorizontalGroup(
            jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 158, Short.MAX_VALUE)
        );
        jPanel5Layout.setVerticalGroup(
            jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 520, Short.MAX_VALUE)
        );

        jTabbedPane1.addTab("Ficheros", jPanel5);

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jTabbedPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 163, Short.MAX_VALUE)
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jTabbedPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 545, Short.MAX_VALUE)
        );

        jSplitPane1.setLeftComponent(jPanel1);
        jSplitPane1.setRightComponent(jtPanelEdicion);

        jPanel2.setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED));

        javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
        jPanel2.setLayout(jPanel2Layout);
        jPanel2Layout.setHorizontalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 834, Short.MAX_VALUE)
        );
        jPanel2Layout.setVerticalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 14, Short.MAX_VALUE)
        );

        jToolBar1.setRollover(true);

        jbGuardar.setText("Guardar");
        jbGuardar.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED));
        jbGuardar.setEnabled(false);
        jbGuardar.setFocusable(false);
        jbGuardar.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jbGuardar.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jbGuardar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jbGuardarActionPerformed(evt);
            }
        });
        jToolBar1.add(jbGuardar);

        javax.swing.GroupLayout jPanel6Layout = new javax.swing.GroupLayout(jPanel6);
        jPanel6.setLayout(jPanel6Layout);
        jPanel6Layout.setHorizontalGroup(
            jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel6Layout.createSequentialGroup()
                .addComponent(jToolBar1, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(740, Short.MAX_VALUE))
        );
        jPanel6Layout.setVerticalGroup(
            jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jToolBar1, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE)
        );

        jMenu1.setText("Proyectos");

        jMenuItem2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem2ActionPerformed(evt);
            }
        });
        jMenuItem2.setText("Nuevo");
        jMenu1.add(jMenuItem2);
        jMenu1.add(jSeparator3);

        jMenuItem5.setText("Salir");
        jMenu1.add(jMenuItem5);

        jMenuBar1.add(jMenu1);

        jMenu2.setText("Edicion");

        jMenuItem6.setText("Preferencias");
        jMenuItem6.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem6ActionPerformed(evt);
            }
        });
        jMenu2.add(jMenuItem6);

        jMenuBar1.add(jMenu2);

        jMenu4.setText("Herramientas");

        Ant.setText("Ant");
        Ant.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                AntActionPerformed(evt);
            }
        });
        jMenu4.add(Ant);

        Tomcat.setText("Tomcat");
        Tomcat.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                TomcatActionPerformed(evt);
            }
        });
        jMenu4.add(Tomcat);

        jMenuBar1.add(jMenu4);

        jMenu3.setText("Ayuda");

        jMenuItem9.setText("Ayuda");
        jMenuItem9.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem9ActionPerformed(evt);
            }
        });
        jMenu3.add(jMenuItem9);

        jMenuItem1.setText("Acerca de");
        jMenuItem1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem1ActionPerformed(evt);
            }
        });
        jMenu3.add(jMenuItem1);

        jMenuBar1.add(jMenu3);

        setJMenuBar(jMenuBar1);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .addComponent(jPanel6, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .addComponent(jSplitPane1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 840, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addComponent(jPanel6, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jSplitPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 545, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void jMenuItem2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem2ActionPerformed
        // TODO add your handling code here:
        //String dir = System.getProperty("user.dir");
        String dir = configuracion.getString("workdir");
        tfDirectorioProyecto.setText(dir);
        tfUbicacionProyecto.setText(tfDirectorioProyecto.getText() + "\\" + tfNombreProyecto.getText());
        edicionProyecto.setSize(new Dimension(400, 200));
        edicionProyecto.setVisible(true);
    }//GEN-LAST:event_jMenuItem2ActionPerformed

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
        // TODO add your handling code here:
        JFileChooser chooser = new JFileChooser();
        chooser.setCurrentDirectory(new java.io.File(configuracion.getString("workdir")));
        chooser.setDialogTitle("Elegir Directorio");
        chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        chooser.setAcceptAllFileFilterUsed(false);

        if (chooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
            tfDirectorioProyecto.setText(chooser.getSelectedFile().getAbsolutePath());
            tfUbicacionProyecto.setText(tfDirectorioProyecto.getText() + "\\" + tfNombreProyecto.getText());
        } else {
            System.out.println("No Selection ");
        }

    }//GEN-LAST:event_jButton1ActionPerformed

    private void tfNombreProyectoKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_tfNombreProyectoKeyTyped
        tfUbicacionProyecto.setText(tfDirectorioProyecto.getText() + "\\" + tfNombreProyecto.getText());        // TODO add your handling code here:
    }//GEN-LAST:event_tfNombreProyectoKeyTyped

    private void tfDirectorioProyectoKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_tfDirectorioProyectoKeyTyped
        // TODO add your handling code here:
        tfUbicacionProyecto.setText(tfDirectorioProyecto.getText() + "\\" + tfNombreProyecto.getText());
    }//GEN-LAST:event_tfDirectorioProyectoKeyTyped

    private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton3ActionPerformed
        // TODO add your handling code here:
        edicionProyecto.setVisible(false);
    }//GEN-LAST:event_jButton3ActionPerformed

    private void jbAceptarProyectoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbAceptarProyectoActionPerformed
        // TODO add your handling code here:
        System.out.println("Creando proyecto desde AppFrame");
        Proyecto pro = new Proyecto(tfNombreProyecto.getText(), tfUbicacionProyecto.getText());
        int resultado = pro.crearNuevo();
        ArbolProyectos arbol = (ArbolProyectos) jtArbolProyectos.getModel();

        if (resultado == Errores.OK_NO_ERROR) {
            arbol.addProyecto(pro);
        }
        DefaultMutableTreeNode raiz = (DefaultMutableTreeNode) jtArbolProyectos.getModel().getRoot();
        jtArbolProyectos.scrollPathToVisible(new TreePath(raiz.getLastLeaf().getPath()));
        edicionProyecto.setVisible(false);
        IDEpfc.refreshTree(raiz);

        ArbolFicheros arbolFicheros = (ArbolFicheros) jtArbolFicheros.getModel();
        arbolFicheros.addProyecto(pro);
        DefaultMutableTreeNode raizficheros = (DefaultMutableTreeNode) jtArbolFicheros.getModel().getRoot();
        IDEpfc.refreshFileTree(raizficheros);

        consola.logTime("Creado proyecto " + pro.nombre + " en " + pro.path);
    }//GEN-LAST:event_jbAceptarProyectoActionPerformed

    private void jbGuardarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbGuardarActionPerformed
        // TODO add your handling code here:
        ide.saveAll();
        jbGuardar.setEnabled(false);
    }//GEN-LAST:event_jbGuardarActionPerformed

    private void jtArbolProyectosMousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jtArbolProyectosMousePressed
        // TODO add your handling code here:
        int selRow = jtArbolProyectos.getRowForLocation(evt.getX(), evt.getY());
        TreePath selPath = jtArbolProyectos.getPathForLocation(evt.getX(), evt.getY());
        if (selPath != null) {
            if (selPath.getLastPathComponent().getClass() != DefaultMutableTreeNode.class) {
                PFCTreeNode n = (PFCTreeNode) selPath.getLastPathComponent();
                n.click(evt);
            }
        }
    }//GEN-LAST:event_jtArbolProyectosMousePressed

    private void jMenuItem7ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem7ActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_jMenuItem7ActionPerformed

    private void jtArbolProyectosMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jtArbolProyectosMouseClicked
    }//GEN-LAST:event_jtArbolProyectosMouseClicked

    private void jMenuItem2ActionPerformed1(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem2ActionPerformed1
        // TODO add your handling code here:
        jMenuItem2ActionPerformed(evt);
    }//GEN-LAST:event_jMenuItem2ActionPerformed1

    private void tfNombreProyectoKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_tfNombreProyectoKeyPressed
        tfUbicacionProyecto.setText(tfDirectorioProyecto.getText() + "\\" + tfNombreProyecto.getText());
    }//GEN-LAST:event_tfNombreProyectoKeyPressed

    private void tfNombreProyectoKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_tfNombreProyectoKeyReleased
        tfUbicacionProyecto.setText(tfDirectorioProyecto.getText() + "\\" + tfNombreProyecto.getText());
    }//GEN-LAST:event_tfNombreProyectoKeyReleased

    private void tfDirectorioProyectoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tfDirectorioProyectoActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_tfDirectorioProyectoActionPerformed

    private void tfDirectorioProyectoKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_tfDirectorioProyectoKeyReleased
        tfUbicacionProyecto.setText(tfDirectorioProyecto.getText() + "\\" + tfNombreProyecto.getText());
    }//GEN-LAST:event_tfDirectorioProyectoKeyReleased

    private void tfDirectorioProyectoKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_tfDirectorioProyectoKeyPressed
        tfUbicacionProyecto.setText(tfDirectorioProyecto.getText() + "\\" + tfNombreProyecto.getText());
    }//GEN-LAST:event_tfDirectorioProyectoKeyPressed

    private void formWindowClosed(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosed
        System.out.println("Aplicacion cerrada");        // TODO add your handling code here:
    }//GEN-LAST:event_formWindowClosed

    private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosing
        // TODO add your handling code here:
        //monitorProyectos.stop();
    }//GEN-LAST:event_formWindowClosing

    private void jtArbolFicherosMousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jtArbolFicherosMousePressed
        int selRow = jtArbolFicheros.getRowForLocation(evt.getX(), evt.getY());
        TreePath selPath = jtArbolFicheros.getPathForLocation(evt.getX(), evt.getY());
        if (selPath != null) {
            if (selPath.getLastPathComponent().getClass() != DefaultMutableTreeNode.class) {
                FileTreeNode n = (FileTreeNode) selPath.getLastPathComponent();
                n.click(evt);
            }
        }        // TODO add your handling code here:
    }//GEN-LAST:event_jtArbolFicherosMousePressed

    private void jMenuItem9ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem9ActionPerformed
        // TODO add your handling code here:
        String url = "http://www.google.com";
        url = "file://resources/project.gif";
        File f = new File(".");
        File fabs = new File(f.getAbsolutePath());
        String path = fabs.getParent();
        path += "/docs/ayuda.html";
        File fileUrl = new File(path);

        System.out.println(fileUrl.toURI());

        if(!java.awt.Desktop.isDesktopSupported()) {

            System.err.println("Desktop is not supported (fatal)");
            System.exit(1);
        }

        java.awt.Desktop desktop = java.awt.Desktop.getDesktop();

        if (!desktop.isSupported(java.awt.Desktop.Action.BROWSE)) {

            System.err.println("Desktop doesn't support the browse action (fatal)");
            System.exit(1);
        }

        try {

            java.net.URI uri = new java.net.URI(url);
            desktop.browse(fileUrl.toURI());
        } catch (Exception e) {

            System.err.println(e.getMessage());
        }

    }//GEN-LAST:event_jMenuItem9ActionPerformed

    private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem1ActionPerformed
        // TODO add your handling code here:
        acercaDe.setModal(true);
        acercaDe.setVisible(true);

    }//GEN-LAST:event_jMenuItem1ActionPerformed

    private void AntActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_AntActionPerformed
        // TODO add your handling code here:
        JFileChooser fc = new JFileChooser();
        fc.setDialogTitle("Directorio de instalacion de ANT");
        fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);

        int seleccion = fc.showOpenDialog(IDEpfc.app);
        if (seleccion == fc.APPROVE_OPTION)
        {
            File antHome = fc.getSelectedFile();
            File antJar = new File(antHome + File.separator + "lib" + File.separator + "ant.jar");
            if (!antJar.exists())
                JOptionPane.showMessageDialog(IDEpfc.app, "El directorio proporcionado no contiene una instalacion valida de ANT");
            else {
                IDEpfc.getConfiguration().setProperty("anthome", antHome);

            }
        }
        
    }//GEN-LAST:event_AntActionPerformed

    private void TomcatActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_TomcatActionPerformed
        // TODO add your handling code here:
        JFileChooser fc = new JFileChooser();
        fc.setDialogTitle("Directorio de instalacion de TOMCAT");
        fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);

        int seleccion = fc.showOpenDialog(IDEpfc.app);
        if (seleccion == fc.APPROVE_OPTION)
        {
            File tomcatHome = fc.getSelectedFile();
            File tomcatJar = new File(tomcatHome + File.separator + "lib" + File.separator + "catalina.jar");
            if (!tomcatJar.exists())
                JOptionPane.showMessageDialog(IDEpfc.app, "El directorio proporcionado no contiene una instalacion valida de TOMCAT");
            else {
                IDEpfc.getConfiguration().setProperty("tomcathome", tomcatHome);

            }
        }
    }//GEN-LAST:event_TomcatActionPerformed

    private void jMenuItem6ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem6ActionPerformed
        // TODO add your handling code here:

        PreferencesEdit pe = new PreferencesEdit(IDEpfc.conf);
        pe.setPreferredSize(new Dimension(342, 265));
        pe.setVisible(true);

        int x = 500;
        int y = 275;
        JDialog dia = new JDialog();
        pe.setDialog(dia);
        dia.setPreferredSize(new Dimension(x,y));
        dia.setMaximumSize(new Dimension(x,y));
        dia.setMinimumSize(new Dimension(x,y));
        dia.setTitle("Edicion de Preferencias");
        dia.add(pe);
        dia.setModal(true);
        dia.setVisible(true);



    }//GEN-LAST:event_jMenuItem6ActionPerformed

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(AppFrame.class.getName()).log(Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            Logger.getLogger(AppFrame.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            Logger.getLogger(AppFrame.class.getName()).log(Level.SEVERE, null, ex);
        } catch (UnsupportedLookAndFeelException ex) {
            Logger.getLogger(AppFrame.class.getName()).log(Level.SEVERE, null, ex);
        }

        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                new AppFrame().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JMenuItem Ant;
    private javax.swing.JMenuItem Tomcat;
    private javax.swing.JDialog acercaDe;
    private javax.swing.JDialog edicionProyecto;
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton3;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JMenu jMenu1;
    private javax.swing.JMenu jMenu2;
    private javax.swing.JMenu jMenu3;
    private javax.swing.JMenu jMenu4;
    private javax.swing.JMenuBar jMenuBar1;
    private javax.swing.JMenuItem jMenuItem1;
    private javax.swing.JMenuItem jMenuItem2;
    private javax.swing.JMenuItem jMenuItem5;
    private javax.swing.JMenuItem jMenuItem6;
    private javax.swing.JMenuItem jMenuItem7;
    private javax.swing.JMenuItem jMenuItem8;
    private javax.swing.JMenuItem jMenuItem9;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JPanel jPanel4;
    private javax.swing.JPanel jPanel5;
    private javax.swing.JPanel jPanel6;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JPopupMenu.Separator jSeparator3;
    private javax.swing.JSplitPane jSplitPane1;
    private javax.swing.JTabbedPane jTabbedPane1;
    private javax.swing.JToolBar jToolBar1;
    private javax.swing.JButton jbAceptarProyecto;
    private javax.swing.JButton jbGuardar;
    private javax.swing.JTree jtArbolFicheros;
    private javax.swing.JTree jtArbolProyectos;
    private javax.swing.JTabbedPane jtPanelEdicion;
    private javax.swing.JPopupMenu propiedadesProyecto;
    private javax.swing.JTextField tfDirectorioProyecto;
    private javax.swing.JTextField tfNombreProyecto;
    private javax.swing.JTextField tfUbicacionProyecto;
    // End of variables declaration//GEN-END:variables

    /**
     * Metodo que carga la configuracion. Se usa la libreria de apache commons-configuration
     * para facilitar la gestion de multiples ficheros.
     * Los ficheros de configuracion deben encontrarse es un directorio llamado conf que al menos debe contener un fichero con el nombre base.conf de tipo properties
     */
    private void loadConfiguration() throws ConfigurationException {
        String base = "./conf/base.conf";
        File f = new File(".");
        String f2 = (new File("./conf/base.conf")).getAbsolutePath();


        configuracion = new CompositeConfiguration();
        configuracion.addConfiguration(new PropertiesConfiguration(base));
        configuracion.setProperty("confdir", "./conf");
        System.out.println(configuracion.getString("workdir"));
    }

    public void enableSaveButton() {
        jbGuardar.setEnabled(true);
    }

    public void addParaEditar(Editor dsProperties, String msg) {
        jtPanelEdicion.add(msg, dsProperties);
        jtPanelEdicion.setSelectedComponent(dsProperties);

    }

    public void disableSaveButton() {
        jbGuardar.setEnabled(false);
    }

    public void refreshTree(TreeNode n) {
        ((DefaultTreeModel) jtArbolProyectos.getModel()).nodeChanged(n);
        ((DefaultTreeModel) jtArbolProyectos.getModel()).reload();
    }

    public void refreshFileTree(TreeNode n)
    {
        ((DefaultTreeModel) jtArbolFicheros.getModel()).nodeChanged(n);
        ((DefaultTreeModel) jtArbolFicheros.getModel()).reload();
    }

    public void initArbolFicheros() {
        //ArbolProyectos a = (ArbolProyectos) jtArbolProyectos.getModel();
        jtArbolFicheros.setModel(ArbolFicheros.load(IDEpfc.conf.getString("workdir")));
    }

    public ArbolFicheros getArbolFicheros() {
        return (ArbolFicheros) jtArbolFicheros.getModel();
    }

    private void initOutputConsole() {
        consola = new OutputConsole();
        jtPanelEdicion.add(consola, "Output");
    }

    public void doLog(String mensaje) {
        consola.log(mensaje);
    }
}
